package com.xinnet.core.validate;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import com.xinnet.core.validate.attribute.Datetime;


/**
 * 日期・时间格式用的Validator类。
 * 
 * @author wenjianye
 * 不是有效日期。
 */
public class DatetimeValidator  extends Validator  implements ConstraintValidator<Datetime,Object> {

  private String format = "";
  private static Properties prop;
  public DatetimeValidator() {
  }

  
  
  @Override
	public void initialize(Datetime annotation) {
	  setFormat(annotation.format());
	}

  
  /**
	 * 接口的验证方法
	 * */	
@Override
public boolean isValid(Object value, ConstraintValidatorContext constraintContext) {
	return super.isValid(value,constraintContext);
}
  public boolean valid(Object value) {

    if (value == null) {
      return true;
    }
    if (value instanceof Date) {
      return true;
    }
    if (!(value instanceof String)) {
      return false;
    }
    String strValue = (String) value;
    
    if (isNullOrEmpty(strValue)) {
      return true;
    }
    
    if(strValue.length() <= 10) {
      strValue = strValue + " 00:00";
    }
    
    boolean result = true;
    try {
      DateFormat df = new SimpleDateFormat(this.getFormat());
      df.setLenient(false);
      df.parse(strValue);

      // SimpleDateFormat是，符合内容前列就OK。
      // 输入内容的长度<>格式内容长度时， 错误。
      // 参考
      // http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/text/DateFormat.html#parse(java.lang.String,%20java.text.ParsePosition)
//      if (strValue.length() != this.getFormat().length()) {
//        result = false;
//      }

    } catch (Throwable t) {
      result = false;
    }
    return result;
  }
  
 
  
  /**
	 * 未通过验证时,提示错误信息
	 * */	
	public String getMessage() {
		//"不是有效日期。";
		return prop.getProperty(this.getClass().getName());
	}
	/**
	   * format取得。
	   * 
	   * @return format
	   */
	  public String getFormat() {
	    return format;
	  }
	  public boolean isNullOrEmpty( String value){
		  return value == null || value.length() == 0;
	  }

	  /**
	   * format设定。
	   * 
	   * @param format
	   *          设定 format
	   */
	  public void setFormat(String format) {
	    this.format = format;
	  }
}
